In diesem Kapitel schauen wir uns an, wie man Regeln für XML-Dokumente definieren kann. Dies kann über eine DTD oder über ein Schema erfolgen. Was ist eine DTD? Eine Dokumenttypdefinition (DTD) ist ein Satz an Regeln, der benutzt wird, um Dokumente eines bestimmten Typs zu deklarieren. Ein Dokumenttyp ist dabei eine Klasse ähnlicher Dokumente, wie beispielsweise Telefonbücher oder Inventurdatensätze. Die Dokumenttypdefinition besteht dabei vorwiegend aus Elementtypen, Attributen von Elementen und Entitäten. In einer DTD wird dabei die Reihenfolge, die Verschachtelung der Elemente und die Art des Inhalts von Attributen festgelegt, und damit also die Struktur des Dokuments. Eine DTD spezifiziert die Syntax einer Anwendung von SGML oder XML, wie die von ihnen abgeleiteten Sprachen HTML oder XHTML. Diese Syntax ist in einer weniger generellen Form gehalten als die SGML- oder XML-Syntax. Mit einer Elementtyp-Deklaration "Element" wird ein Element und sein möglicher Inhalt definiert. In einem gültigen Dokument dürfen nur Elemente vorkommen, die in der DTD definiert sind. Der Inhalt eines Elementes kann durch die Angabe anderer Elementnamen und durch einige Schlüsselwörter und Zeichen angegeben werden. Diese Folie erläutert die verschiedenen Inhaltsmodelle und Symbole, die in einer Dokumenttypdefinition (DTD) verwendet werden, um die Struktur und den Inhalt von XML-Elementen zu definieren. Zunächst wird das Symbol "PCData" erklärt, das für Parsed Character Data steht und anzeigt, dass das Element Zeicheninhalt enthalten kann. "Empty" zeigt an, dass das Element keinen Inhalt hat, während "any" angibt, dass das Element beliebigen Inhalt haben kann. Das Komma wird verwendet, um die Reihenfolge von Unterelementen festzulegen, wohingegen das Pipe-Symbol für Alternativen steht und im Sinne von "entweder, oder" verwendet wird. Klammern dienen zum Gruppieren von Elementen und ermöglichen komplexere Strukturen. Das Sternsymbol zeigt an, dass das Element beliebig oft aufeinander folgen kann, während das Pluszeichen angibt, dass das Element mindestens einmal vorkommen muss. Das Fragezeichen bedeutet, dass das Element entweder keinmal oder genau einmal vorkommen kann. Wenn kein Stern, Pluszeichen oder Fragezeichen angegeben ist, muss das Element genau einmal vorkommen. Diese Symbole und Regeln sind wesentliche Bestandteile einer DTD und ermöglichen die Definition der Struktur und des Inhalts von XML-Dokumenten. Sie helfen sicherzustellen, dass die Dokumente gültig sind, indem sie Vorgaben für die erlaubten Elemente und deren Anordnung machen. Hier sehen Sie, wie Attribute innerhalb einer DTD definiert werden. Attribute werden in einer Attributliste festgelegt, die mit der angegebenen Deklaration beginnt. Diese Attributliste enthält durch Leerzeichen oder Zeilenumbrüche getrennt die einzelnen Attributnamen, deren Typ und die Vorgaben für diese Attribute. Beispiele für Attribute sind ID, ID-Ref und ID-Refs sowie NM-Token und NM-Tokens. Ein ID-Attribut wird verwendet, um ein eindeutiges Kennzeichen für ein Element zu definieren. ID-Ref und ID-Refs sind Attribute, die auf ein anderes Element im Dokument verweisen und Referenzen darstellen. NM-Token und NM-Tokens dienen zur Angabe von Namens-Token, die eine spezielle Zeichenkette repräsentieren. Mit den Attribut-Vorgaben kann angegeben werden, ob ein Attribut vorkommen muss, ob es optional ist oder einen festen Wert enthält und welcher Wert als Standardwert benutzt wird, falls das Attribut bei einem Tag nicht angegeben wird. Hier sehen Sie als Beispiel eine Attribut-Deklaration für das image-Tag in HTML. Das Attribut id ist optional, source ist ebenso notwendig wie alt und "ismap" ist optional. Dazwischen sehen Sie die verbindlichen Datentypen, die einzuhalten sind, wenn ein Attribut angegeben ist und das XML-Dokument gemäß dieser DTD gültig sein soll. Entitäten bestehen aus Zeichenketten und können selber wieder Entitäten enthalten. Eine Entität ist ein Platzhalter für Text oder Daten, der innerhalb eines XML-Dokuments verwendet werden kann. Entitäten ermöglichen die Wiederverwendung und Modularisierung von Daten sowie die Einbindung von externen Inhalten. Hier sehen Sie eine Entität, die den Namen "name" hat und mit dem Wert "Benedikt" gefüllt ist. Darunter wird die Entität "Papst" definiert, die die zuvor definierte Entität "name" verwendet. Abschließend sehen Sie eine Entität "w-p-link", die eine Abkürzung für einen ganzen HTML-Hyperlink ist. Die Folie zeigt ein Beispiel für eine XML-Datei, die gemäß Zeile zwei nach einer externen DTD definiert ist. Das Dokument beginnt wie immer mit der XML-Deklaration, die hier die Version und die Zeichenkodierung des Dokuments spezifiziert. Danach kommt das Wurzelelement "note" mit den Elementen "to", "from", "heading" und "body". Und hier sehen sie die passende DTD-Datei, die von der XML-Datei verwendet wird. Sie definiert das Element "note", das aus den vier Elementen "to", "from", "heading" und "body" bestehen muss. Danach werden diese vier Elemente einzeln definiert und mit den Datentypen "PCData" versehen. Hier sehen Sie eine grundlegende DTD zum HTML-Standard. Das Wurzelement "html" muss aus "head" und "body" bestehen. Danach werden dann die Elemente "hr", "div" und "dl" definiert. Schauen Sie, welche Elemente sich alle in einem div-Element befinden können! Beachten Sie auch das Sternchen dahinter. Das "dl"-Element muss seinerseits aus mindestens einem "dt" oder "dd" Element bestehen. Solche DTDs werden heutzutage nicht mehr so gern gesehen. Lange Zeit war der Weg über eine DTD der einzige Weg zur Beschreibung einer XML-Datenstruktur. Allerdings hat eine DTD gravierende Mängel: Zunächst fehlt es daran, Elementen und Attributen präzisen Datentypen zuweisen zu können. Vergleichen Sie beispielsweise CData und PCData mal mit den Java-Datentypen. Eine DTD hat selbst keine XML-Syntax, sondern eher an die Sprache von regulären Ausdrücken angelehnt. Daher kann eine DTD nicht von einem gewöhnlichen XML-Parser analysiert werden. Und eine DTD ist nicht zu namespaces kompatibel. Eine XML Schema Definition (XSD) ist eine Empfehlung des W3C zum Definieren von Strukturen für XML-Dokumente. Anders als bei den klassischen XML-DTDs wird die Struktur in Form eines XML-Dokuments beschrieben. Darüber hinaus wird eine große Anzahl von Datentypen unterstützt. XML Schema unterscheidet zwischen einfachen atomaren Datentypen und komplexen Datentypen. Datentypen in XML Schema werden weiterhin klassifiziert in eingebaute beziehungsweise vordefinierte sowie benutzerdefinierte Datentypen. XML Schema stellt einige grundlegende atomare Datentypen bereit. Die atomaren Datentypen enthalten die klassischen Datentypen, wie sie auch in Programmiersprachen wie C, Java oder SQL spezifiziert sind: Dies sind string, decimal, integer, float, boolean, date und time. Hinzu kommen weitere XML-spezifische atomare Typen, unter anderem ein qualifizierter Name, ein global eindeutiger Bezeichner, ein Uniform Resource Identifier (URI), eine Sprachbezeichnung, zum Beispiel Deutsch, Englisch oder Französisch, ein Identifikationsattribut innerhalb von XML-Elementen sowie eine Referenz auf ein solches Identifikationsattribut. Das folgende Beispiel definiert einen neuen XML-Datentyp mit dem Namen "monat-Int" sowie eine Liste monate dieses neuen Typs. Dabei wird festgelegt, dass die ganzen Zahlen von eins bis zwölf erlaubt sind. Darunter wird eine Liste von Monaten definiert, die Liste heißt "monate". Eine Instanz des neuen Typs könnte dann wie folgt aussehen: Ein neuer Typ wird als Vereinigungsmenge bereits bestehender Typen definiert. Jede Instanz wählt dann ihren Typ aus dieser Menge. Das nachfolgende Beispiel verwendet "monat-Int" von der vorherigen Folie und definiert einen weiteren Typ "monatsname" sowie einen Union-Typ "monat": XML-Elemente vom Typ monat dürfen entweder ganzzahlige Werte im Bereich eins bis zwölf enthalten oder eine der entsprechenden Monatsbezeichnungen als Zeichenkette. Gültige Instanzen sind beispielsweise "Jan" oder "zwei". Hier sehen Sie, wie man einen eigenen komplexen Datentyp mit XML-Schema anlegt. Ein PC-Typ besteht aus einer Sequenz von Name, Hersteller, Prozessor, Megaherz-Zahl und einem Kommentar. Die ersten drei Elemente sind Zeichenketten. Die Megaherz-Zahl ist ein Integer, der aber optional ist. Auch der Kommentar ist optional. Außerdem hat der PC-Typ ein Attribut ID vom Typ Integer. Eine PC-Liste ist eine beliebig lange Liste von PCs, die vom Datentyp PC-Typ sind. Hier sehen Sie ein Beispiel einer XML-Datei, die aus einer solchen PC-Liste besteht. In der Liste sind zwei PCs. Jeder PC hat einen Namen, einen Hersteller, einen Prozessor, eine Megaherz-Zahl und einen Kommentar. Schauen wir uns zum Abschluss eine XML-Bücherliste (Book-Catalogue) an, die aus zwei Büchern besteht. Jedes Buch hat die Elemente Title, Author, Date, ISBN und Publisher. Hier sehen Sie die passende DTD dazu. Book-Catalogue besteht aus beliebig vielen Büchern. Jedes Buch hat Title, Author, Date, ISBN und Publisher. Danach werden die fünf Elemente mit dem Datentyp PCData versehen. Das Ganze ist sehr übersichtlich, aber eben auch grob. Dieselbe Spezifikation wird in den folgenden fünf Folien als XML-Schema erstellt. Hier beginnt die Definition des XML-Schemas. Dabei wird zunächst der Autor als String definiert sowie ein Buch, dass aus den fünf Elementen Title, Author, Date, ISBN und Publisher besteht. Ein Book-Catalogue besteht aus beliebig vielen Büchern. "Author" hat ja den einfachen Typ String. "Title" darf in diesem Fall nur aus dieser Menge sein: Neunzehnhundertvierundachtzig oder Computernetzwerke. Dies sind Zeichenketten. Hier sehen Sie einmal, wie man eine Enumeration aufbaut. Solche Mengen werden hier noch einmal für das Datum und für die ISBN-Nummer definiert. Abschließend wird noch der Publisher als Zeichenkette definiert. Wie viel Text war das jetzt zur Beschreibung des XML-Schemas im Vergleich zur DTD? Wie genau ist die Schema-Definition im Vergleich zur DTD?